/*
 * PlayScenarioPanel.cpp
 *
 *  Created on: Oct 24, 2011
 *      Author: gonzalo
 */

#include "PlayScenarioPanel.h"

PlayScenarioPanel::PlayScenarioPanel(int xPos, int yPos, Widget* parent,
		BattleMasterInterface* interface) :
		ScenarioPanel("Juego Remoto", xPos, yPos, parent) {
	this->owner = interface->getOwner();

	cout<<"El escenario es:"<<interface->getBackgroundPath()<<"<-"<<endl;
	this->updateBackground(interface->getBackgroundPath());

	this->setElements(interface->getElements());

}

void PlayScenarioPanel::addPlayer(TankStatus* tankStatus){
	//Verifico que esta.
	bool found =false;

	Tank* jugador = NULL;
	std::list<Tank*>::iterator it_jugador;
	for (it_jugador = jugadores.begin(); it_jugador != jugadores.end();
			++it_jugador) {
		jugador = *it_jugador;
		if (jugador->getOwner() == tankStatus->getOwner()) {
			//TODO hacer algo... actualizar estado o algo
			found = true;
		}
	}

	//Si no lo encontre lo agrego a la pantalla
	if (!found) {
		addPlayer(tankStatus->getOwner(),tankStatus->getPosX(),tankStatus->getPosY(),tankStatus->getAngle());
	}

}

void PlayScenarioPanel::addPlayer(std::string owner, int x, int y,int angle) {
	Tank* newTank = new Tank(x, y, this, owner,angle);

	//TODO remover Parche
	if (jugadores.empty()) {
		newTank->duenoesinstancialocal = true;
	}
	this->jugadores.push_back(newTank);


	this->add(newTank);
}

void PlayScenarioPanel::resolve() {

	Tank* jugador = NULL;

	std::list<Bullet*>::iterator aux;
	std::list<Bullet*>::iterator it_bullet;

	//wtf?
	for (it_bullet = bullets.begin(); it_bullet != bullets.end(); ++it_bullet) {
		aux = (it_bullet);
		if (!(*aux)->isDrawable()) {
			//bullets.erase(aux);
		}
	}

	for (it_bullet = bullets.begin(); it_bullet != bullets.end(); ++it_bullet) {
		aux = (it_bullet);
		(*aux)->resolve();
	}

	/*
	 * Los widgets ScenarioElements no se resuelven por el momento;
	 */
	std::list<Tank*>::iterator it_jugador;
	for (it_jugador = jugadores.begin(); it_jugador != jugadores.end();
			++it_jugador) {
		jugador = *it_jugador;
		jugador->resolve();
		if (jugador->isShooting()) {
			bullets.push_back(new Bullet(jugador->getbulletX(), jugador->getbulletY(),this, jugador->getBulletAngle()));
		}
	}

}

void PlayScenarioPanel::showOn(SDL_Surface *surface) {
	SDL_Rect rect;
	rect.x = parcel.posX;
	rect.y = parcel.posY;
	rect.w = parcel.width;
	rect.h = parcel.height;

	SDL_BlitSurface(panel, NULL, surface, &rect);

	for (it_widget = widgets.begin(); it_widget != widgets.end(); ++it_widget) {
		((Widget*) *it_widget)->showOn(surface);
	}

	std::list<Bullet*>::iterator it_bullet;
	for (it_bullet = bullets.begin(); it_bullet != bullets.end(); ++it_bullet) {
		((Widget*) *it_bullet)->showOn(surface);
	}

	std::list<Tank*>::iterator it_jugador;
	for (it_jugador = jugadores.begin(); it_jugador != jugadores.end();
			++it_jugador) {
		(*it_jugador)->showOn(surface);
	}

}

void PlayScenarioPanel::addBullet(int x, int y, int angle) {
	Bullet* bullet = new Bullet(x, y, this, angle);
	bullets.push_back(bullet);
}

TankStatus PlayScenarioPanel::getTankStatus() {
	return ((Tank*) this->getPlayerTank())->getTankStatus();
}

Tank* PlayScenarioPanel::getPlayerTank() {
	std::list<Tank*>::iterator it_tank;

	Tank* tanque = NULL;
	std::list<Tank*>::iterator it_jugador;
	for (it_tank = jugadores.begin(); it_tank != jugadores.end(); ++it_tank) {
		tanque = ((Tank*) *it_tank);
		if (tanque->duenoesinstancialocal)
			return tanque;
	}

	return tanque;
}

PlayScenarioPanel::~PlayScenarioPanel() {
	SDL_FreeSurface(panel);

}
